import * as Blockly from 'blockly';
import { javascriptGenerator } from 'blockly/javascript';

/**
 * 重写变量代码生成逻辑
 * 如果变量名以@开头，则直接生成字符串，不需要定义变量
 */
export function registerVariableGenerators() {
  // 保存原始的变量获取块代码生成器
  const originalVariablesGet = (javascriptGenerator as any)['variables_get'];

  // 重写变量获取块的代码生成器
  (javascriptGenerator as any)['variables_get'] = function (block: Blockly.Block) {
    // 获取变量名
    const nameDB = javascriptGenerator.nameDB_;
    if (!nameDB) {
      console.error('nameDB_ is undefined in javascriptGenerator');
      return ['', 0]; // Return empty string if nameDB is undefined
    }
    
    const varName = nameDB.getName(
      block.getFieldValue('VAR'),
      Blockly.VARIABLE_CATEGORY_NAME
    );

    console.log("varName",varName);
    // 检查变量名是否以@开头
    if (varName.startsWith('@')) {
      // 对于以@开头的变量，直接返回变量名作为字符串
      return [`"${varName}"`, 0]; // 0 is ORDER_ATOMIC
    } else {
      // 对于普通变量，使用原始的代码生成器
      return originalVariablesGet.call(this, block);
    }
  };

  // 保存原始的变量设置块代码生成器
  const originalVariablesSet = (javascriptGenerator as any)['variables_set'];

  // 重写变量设置块的代码生成器
  (javascriptGenerator as any)['variables_set'] = function (block: Blockly.Block) {
    // 获取变量名
    const nameDB = javascriptGenerator.nameDB_;
    if (!nameDB) {
      console.error('nameDB_ is undefined in javascriptGenerator');
      return ''; // Return empty string if nameDB is undefined
    }
    
    const varName = nameDB.getName(
      block.getFieldValue('VAR'),
      Blockly.VARIABLE_CATEGORY_NAME
    );

    // 获取要设置的值
    const value =
      javascriptGenerator.valueToCode(
        block,
        'VALUE',
        3 // 3 is ORDER_ASSIGNMENT
      ) || '0';

    // 检查变量名是否以@开头
    if (varName.startsWith('@')) {
      // 对于以@开头的变量，生成一个注释说明不能设置系统变量
      return `// 系统变量 ${varName} 不能被直接设置\n`;
    } else {
      // 对于普通变量，使用原始的代码生成器
      return originalVariablesSet.call(this, block);
    }
  };
}
